package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.school.sports.entity.Score;
import com.school.sports.entity.Rank;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 成绩管理服务接口
 */
public interface ScoreService extends IService<Score> {

    /**
     * 分页查询成绩列表
     * @param page 分页对象
     * @param queryWrapper 查询条件
     * @return 分页结果
     */
    IPage<Score> page(Page<Score> page, com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<Score> queryWrapper);

    /**
     * 根据ID查询成绩详情（包含用户、项目、裁判信息）
     * @param id 成绩ID
     * @return 成绩详情
     */
    Score getScoreWithDetails(Long id);

    /**
     * 录入成绩
     * @param score 成绩信息
     * @return 录入结果
     */
    boolean recordScore(Score score);

    /**
     * 更新成绩信息
     * @param score 成绩信息
     * @return 更新结果
     */
    boolean updateScore(Score score);

    /**
     * 删除成绩
     * @param id 成绩ID
     * @return 删除结果
     */
    boolean deleteScore(Long id);

    /**
     * 批量删除成绩
     * @param ids 成绩ID列表
     * @return 删除结果
     */
    boolean batchDeleteScores(List<Long> ids);

    /**
     * 审核成绩
     * @param id 成绩ID
     * @param status 审核结果
     * @param note 审核意见
     * @return 审核结果
     */
    boolean auditScore(Long id, String status, String note);

    /**
     * 批量审核成绩
     * @param ids 成绩ID列表
     * @param status 审核结果
     * @param note 审核意见
     * @return 审核结果
     */
    boolean batchAuditScores(List<Long> ids, String status, String note);

    /**
     * 公示成绩
     * @param id 成绩ID
     * @return 公示结果
     */
    boolean publishScore(Long id);

    /**
     * 批量公示成绩
     * @param ids 成绩ID列表
     * @return 公示结果
     */
    boolean batchPublishScores(List<Long> ids);

    /**
     * 驳回成绩
     * @param id 成绩ID
     * @param reason 驳回原因
     * @return 驳回结果
     */
    boolean rejectScore(Long id, String reason);

    /**
     * 标记成绩异议
     * @param id 成绩ID
     * @param reason 异议原因
     * @return 标记结果
     */
    boolean markScoreDisputed(Long id, String reason);

    /**
     * 根据用户ID查询成绩列表
     * @param userId 用户ID
     * @return 成绩列表
     */
    List<Score> getScoresByUserId(Long userId);

    /**
     * 根据项目ID查询成绩列表
     * @param projectId 项目ID
     * @return 成绩列表
     */
    List<Score> getScoresByProjectId(Long projectId);

    /**
     * 根据裁判ID查询成绩列表
     * @param refereeId 裁判ID
     * @return 成绩列表
     */
    List<Score> getScoresByRefereeId(Long refereeId);

    /**
     * 根据状态查询成绩列表
     * @param status 成绩状态
     * @return 成绩列表
     */
    List<Score> getScoresByStatus(String status);

    /**
     * 根据项目和轮次查询成绩列表
     * @param projectId 项目ID
     * @param round 轮次
     * @return 成绩列表
     */
    List<Score> getScoresByProjectAndRound(Long projectId, Integer round);

    /**
     * 获取项目的最佳成绩
     * @param projectId 项目ID
     * @param round 轮次
     * @return 最佳成绩
     */
    Score getBestScore(Long projectId, Integer round);

    /**
     * 计算项目排名
     * @param projectId 项目ID
     * @param round 轮次
     * @return 排名列表
     */
    List<Rank> calculateRankings(Long projectId, Integer round);

    /**
     * 保存排名结果
     * @param rankings 排名列表
     * @return 保存结果
     */
    boolean saveRankings(List<Rank> rankings);

    /**
     * 根据项目ID查询排名
     * @param projectId 项目ID
     * @param round 轮次
     * @return 排名列表
     */
    List<Rank> getRankingsByProject(Long projectId, Integer round);

    /**
     * 根据用户ID查询排名
     * @param userId 用户ID
     * @return 排名列表
     */
    List<Rank> getRankingsByUser(Long userId);

    /**
     * 统计各种状态的成绩数量
     * @return 统计结果Map，key为状态，value为数量
     */
    Map<String, Long> getScoreStatusStatistics();

    /**
     * 获取所有成绩状态
     * @return 成绩状态列表
     */
    List<String> getAllScoreStatuses();

    /**
     * 检查是否已录入成绩
     * @param userId 用户ID
     * @param projectId 项目ID
     * @param round 轮次
     * @return 是否已录入
     */
    boolean isScoreRecorded(Long userId, Long projectId, Integer round);

    /**
     * 检查成绩是否可以修改
     * @param scoreId 成绩ID
     * @return 是否可以修改
     */
    boolean canModifyScore(Long scoreId);

    /**
     * 检查成绩是否可以审核
     * @param scoreId 成绩ID
     * @return 是否可以审核
     */
    boolean canAuditScore(Long scoreId);

    /**
     * 获取成绩统计信息
     * @param projectId 项目ID（可选）
     * @return 统计信息
     */
    Map<String, Object> getScoreStatistics(Long projectId);

    /**
     * 获取个人成绩统计
     * @param userId 用户ID
     * @return 个人统计信息
     */
    Map<String, Object> getPersonalScoreStatistics(Long userId);

    /**
     * 获取项目成绩分析
     * @param projectId 项目ID
     * @return 成绩分析数据
     */
    Map<String, Object> getProjectScoreAnalysis(Long projectId);

    /**
     * 验证成绩有效性
     * @param score 成绩对象
     * @return 验证结果
     */
    boolean validateScore(Score score);

    /**
     * 自动计算排名
     * @param projectId 项目ID
     * @param round 轮次
     * @return 计算结果
     */
    boolean autoCalculateRankings(Long projectId, Integer round);

    /**
     * 获取奖牌统计
     * @param projectId 项目ID（可选）
     * @return 奖牌统计
     */
    Map<String, Integer> getMedalStatistics(Long projectId);

    /**
     * 检查成绩是否破纪录
     * @param score 成绩对象
     * @return 是否破纪录
     */
    boolean isRecordBreaking(Score score);

    /**
     * 获取项目纪录
     * @param projectId 项目ID
     * @param round 轮次
     * @return 项目纪录
     */
    Score getProjectRecord(Long projectId, Integer round);
}
